//给你一个头结点为 head 的单链表和一个整数 k ，请你设计一个算法将链表分隔为 k 个连续的部分。 
//
// 每部分的长度应该尽可能的相等：任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 
//
// 这 k 个部分应该按照在链表中出现的顺序排列，并且排在前面的部分的长度应该大于或等于排在后面的长度。 
//
// 返回一个由上述 k 部分组成的数组。 
// 
//
// 示例 1： 
//
// 
//输入：head = [1,2,3], k = 5
//输出：[[1],[2],[3],[],[]]
//解释：
//第一个元素 output[0] 为 output[0].val = 1 ，output[0].next = null 。
//最后一个元素 output[4] 为 null ，但它作为 ListNode 的字符串表示是 [] 。
// 
//
// 示例 2： 
//
// 
//输入：head = [1,2,3,4,5,6,7,8,9,10], k = 3
//输出：[[1,2,3,4],[5,6,7],[8,9,10]]
//解释：
//输入被分成了几个连续的部分，并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。
// 
//
// 
//
// 提示： 
//
// 
// 链表中节点的数目在范围 [0, 1000] 
// 0 <= Node.val <= 1000 
// 1 <= k <= 50 
// 
// Related Topics 链表 👍 267 👎 0


package leetcode.editor.cn;

/**
 * 分隔链表
 * @date 2022-07-20 09:08:22
 */
class P725_SplitLinkedListInParts{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new P725_SplitLinkedListInParts().new Solution();
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
	/**
	 * 1，遍历链表获取长度 length（这个跑不掉 😓）；
	 * 2，length 除以 k 得到每段链表的平均长度 aveLength 和 余数 remain，remain的值就是有多少个长度为 (aveLength + 1) 的子链表排在前面。
	 *     2.1，举个例子帮助理解一下 11 / 3 = 3 余 2： 一共有3段，每段平均3个节点，但是剩下了2个节点，剩下的2个节点不能丢啊，得全部塞到子链表里面去，怎么塞呢？
	 *     2.2，根据题意长的链表排前面，短的链表排后面，所以只有前面的两个子链表一人分担一个多余的节点，如此一来便形成了 4 4 3 的结构。
	 * 3，接下来的事儿就比较简单了，按照每个子链表应该的长度[4, 4, 3]去截断给定的链表。
	 */
    public ListNode[] splitListToParts(ListNode head, int k) {
		ListNode p = head;
		int length = 0;
		while(p != null){
			length++;
			p = p.next;
		}
		int avglength = length / k;//每个子链表的平均长度
		int remain = length % k;//余数
		ListNode[] res = new ListNode[k];
		p = head;
		for (int i = 0; i < k && p != null; i++) {
			res[i] = p;//子链表的首指针
			int listlength = remain > 0 ? avglength+1 : avglength;
			remain--;
			for (int j = 0; j < listlength - 1; j++) {
				p = p.next;
			}
			ListNode temp = p.next;//防止断链,temp指向节点的下一个节点
			p.next = null;
			p = temp;
		}
		return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
